package repository

import (
	"errors"

	"gitee.com/ysl729895/go-mall/internal/model"
	"gorm.io/gorm"
)

// UserRepository 定义用户数据操作接口，便于 mock 和解耦
//go:generate mockgen -source=user_repository.go -destination=mock_user_repository.go -package=repository
// 主要方法：创建、查找、更新用户

type UserRepository interface {
	Create(user *model.User) error
	GetByUsername(username string) (*model.User, error)
	GetByID(id uint) (*model.User, error) // 新增方法
	Update(user *model.User) error
}

// userRepository 实现 UserRepository 接口
// 封装 gorm.DB

type userRepository struct {
	db *gorm.DB
}

// NewUserRepository 构造函数，注入 gorm.DB
func NewUserRepository(db *gorm.DB) UserRepository {
	return &userRepository{db: db}
}

// ErrUserNotFound 用户未找到错误
var ErrUserNotFound = errors.New("用户未找到")

// Create 创建新用户
func (r *userRepository) Create(user *model.User) error {
	return r.db.Create(user).Error
}

// GetByUsername 根据用户名查找用户，未找到返回 ErrUserNotFound
func (r *userRepository) GetByUsername(username string) (*model.User, error) {
	var user model.User
	err := r.db.Where("username = ?", username).First(&user).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, ErrUserNotFound
	}
	return &user, err
}

// Update 更新用户信息
func (r *userRepository) Update(user *model.User) error {
	return r.db.Save(user).Error
}

func (r *userRepository) GetByID(id uint) (*model.User, error) {
	var user model.User
	err := r.db.First(&user, id).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, ErrUserNotFound
	}
	return &user, err
}
